/* eslint-disable no-undef,import/first,prefer-destructuring */
import React, { Component } from 'react';
import * as utils from '../../../utils/utils';
import ShowTypeNew from '../../Common/ShowType/ShowTypeNew';

/**   table列属性   */
class StaticEditTableCell extends Component {
  /**   构造函数   */
  constructor(props) {
    super(props);
    this.state = {};
    this.sSlaveId = ''; /*   从表编号(数据格式:字符串)   */
    this.sName = ''; /*   控件名(数据格式:字符串)   */
    this.propsAllData = {}; /*   showType需要用到的参数(数据格式:对象)   */
    this.dataValue = {}; /*   showType数据(数据格式:对象)   */
    this.showConfig = {}; /*   关于本showType相关配置(数据格式:对象)   */
    this.isRender = false; /*   控制每一个showType是否需要渲染(数据格式:对象{sSLaveId1:{sName1:true,sName2:false},sSLaveId2:{sName1:true,sName2:false}})   */
    this.app = {}; /*   全局数据(数据格式:对象)    */
    this.formId = ''; /*   窗体Id(数据格式:字符串)   */
    this.sId = ''; /*   主表Id(数据格式:字符串)   */
    this.onSlaveChange = () => {}; /*   表单数据改变事件方法(数据格式:函数)   */
    this.onReturnMasterSelectValue = () => {}; /*   回带主表下拉数据(数据格式:函数)   */
    this.onReturnSlaveSelectValue = () => {}; /*   回带从表下拉数据(数据格式:函数)   */
  }

  /**   渲染前只执行一次   */
  componentWillMount() {
    /**   数据转换   */
    this.convertData(this.props);
  }

  /**   props改变的时候触发   */
  componentWillReceiveProps(nextProps) {
    /**   数据转换   */
    this.convertData(nextProps);
  }

  /**   获取窗体编号   */
  getFormId = (propsAllData) => {
    /*   返回值声明   */
    let str = '';
    /*   数据在propsAllData.formId   */
    if (utils.isNotEmptyObject(propsAllData)) {
      str = utils.strUndefinedToEmpty(propsAllData.formId);
    }
    /*   返回值   */
    return str;
  }

  /**   获取全局信息   */
  getApp = (propsAllData) => {
    /*   返回值声明   */
    let obj = {};
    /*   数据在propsAllData.app   */
    if (utils.isNotEmptyObject(propsAllData)) {
      const app = propsAllData.app;
      if (utils.isNotEmptyObject(app)) {
        obj = app;
      }
    }
    /*   返回值   */
    return obj;
  }

  /**   获取isRender   */
  getIsRender = (propsAllData) => {
    /*   返回值声明   */
    let isRender = false;
    /*   数据在propsAllData.isShowTypeRender中   */
    if (utils.isNotEmptyObject(propsAllData)) {
      const isShowTypeRender = propsAllData.isShowTypeRender;
      if (utils.isNotEmptyObject(isShowTypeRender)) {
        const isRowRender = isShowTypeRender[this.sSlaveId];
        if (utils.isNotEmptyObject(isRowRender)) {
          isRender = utils.converNumStrToBoolean(isRowRender[this.sName]);
        }
      }
    }
    /*   返回值   */
    return isRender;
  }

  /**   获取showConfig   */
  getShowConfig = (propsAllData) => {
    /*   返回值声明   */
    let showConfig = [];
    /*   数据在propsAllData.showConfigList中,showConfigList里过滤showConfigList.sName和this.sName相等的那条数据   */
    if (utils.isNotEmptyObject(propsAllData)) {
      const showConfigList = propsAllData.showConfigList;
      if (utils.isNotEmptyArr(showConfigList)) {
        const showConfigArr = showConfigList.filter(item => item.sName === this.sName);
        if (utils.isNotEmptyArr(showConfigArr)) {
          showConfig = showConfigArr[0];
        }
      }
    }
    /*   返回值   */
    return showConfig;
  }

  /**   获取showType需要用到的参数   */
  getPropsAllData = (props) => {
    /*   返回值声明   */
    let obj = {};
    /*   遍历结构获取showType参数(this.props.children[1].props.record.sId)   */
    const children = props.children;
    if (utils.isNotEmptyArr(children) && children.length > 1) {
      const childProps = children[1].props;
      if (utils.isNotEmptyObject(childProps)) {
        const record = childProps.record;
        if (utils.isNotEmptyObject(record) && utils.isNotEmptyObject(record.propsAllData)) {
          obj = record.propsAllData;
        }
      }
    }
    /*   返回值   */
    return obj;
  }

  /**   获取showType dataValue   */
  getDataValue = (props) => {
    let obj = {};
    const children = props.children;
    if (utils.isNotEmptyArr(children) && children.length > 2) {
      obj = this.getValueObj(children[2]);
    }
    return obj;
  }

  /**   获取控件名   */
  getName = (props) => {
    let name = '';
    const children = props.children;
    if (utils.isNotEmptyArr(children) && children.length > 2) {
      name = this.getKey(children[2]);
    }
    return name;
  }

  /**   获取从表编号   */
  getSlaveId = (props) => {
    /*   遍历结构获取从表主键(this.props.children[1].props.record.sId)   */
    const child = props.children;
    if (utils.isNotEmptyArr(child) && child.length > 1) {
      const childProps = child[1].props;
      if (utils.isNotEmptyObject(childProps)) {
        const record = childProps.record;
        if (utils.isNotEmptyObject(record) && utils.isNotEmptyStr(record.sId)) {
          const value = this.getValueStr(record.sId);
          if (utils.isNotEmptyStr(value)) {
            return value;
          }
        }
      }
    }
    /*   若没有取到相应的从表编号就创建一个   */
    return utils.createSid();
  }

  /**   获取key   */
  getKey = (value) => {
    /*   返回值声明   */
    let str = '';
    /*   数据格式(key[-]value)   */
    if (utils.isNotEmptyStr(value)) {
      const arr = value.split('[-]');
      if (arr.length > 0) {
        str = arr[0];
      }
    }
    /*   返回值   */
    return str;
  }

  /**   获取值(字符串)   */
  getValueStr = (value) => {
    /*   返回值声明   */
    let str = '';
    /*   数据格式(key[-]value)   */
    if (utils.isNotEmptyStr(value)) {
      const arr = value.split('[-]');
      if (arr.length > 1) {
        str = arr[1];
      }
    }
    /*   返回值   */
    return str;
  }

  /**   获取值(对象)   */
  getValueObj = (value) => {
    /*   返回值声明   */
    const obj = {};
    /*   数据格式(key[-]value)   */
    if (utils.isNotEmptyStr(value)) {
      const arr = value.split('[-]');
      if (arr.length > 1) {
        obj[arr[0]] = arr[1];
      }
    }
    /*   返回值   */
    return obj;
  }

  /**   获取ShowType的props   */
  getShowTypeProps = () => {
    const obj = {
      sSlaveId: this.sSlaveId, /*   从表编号(数据格式:字符串)   */
      masterData: this.propsAllData.masterData, /*   主表数据(数据格式:对象)   */
      slaveData: this.propsAllData.slaveData, /*   从表数据(数据格式:数组)   */
      dataValue: this.dataValue, /*   本showType数据(数据格式:对象)   */
      disabled: this.showConfig.disabled, /*   是否是查看状态(数据格式:布尔)   */
      isRender: this.isRender, /*   是否渲染(数据格式:布尔)   */
      app: this.app, /*   全局数据(数据格式:对象)    */
      showConfig: this.showConfig, /*   关于本showType相关配置(数据格式:对象)   */
      formId: this.formId, /*   窗体Id(数据格式:字符串)   */
      sId: this.sId, /*   主表Id(数据格式:字符串)   */
    };
    return obj;
  }

  /**   获取主表编号   */
  getMasterId = (propsAllData) => {
    /*   返回值声明   */
    let str = '';
    /*   数据在propsAllData.sId   */
    if (utils.isNotEmptyObject(propsAllData)) {
      str = utils.strUndefinedToEmpty(propsAllData.sId);
    }
    /*   返回值   */
    return str;
  }

  /**   获取回带函数   */
  getReturnFunc = (propsAllData) => {
    /*   返回值声明   */
    const funcObj = {
      onSlaveChange: () => {}, /*   表单数据改变事件方法(数据格式:函数)   */
      onReturnMasterSelectValue: () => {}, /*   回带主表下拉数据(数据格式:函数)   */
      onReturnSlaveSelectValue: () => {}, /*   回带从表下拉数据(数据格式:函数)   */
    };
    /*   数据在propsAllData.sId   */
    if (utils.isNotEmptyObject(propsAllData)) {
      funcObj.onSlaveChange = propsAllData.onSlaveChange;
      funcObj.onReturnMasterSelectValue = propsAllData.onReturnMasterSelectValue;
      funcObj.onReturnSlaveSelectValue = propsAllData.onReturnSlaveSelectValue;
    }
    /*   返回值   */
    return funcObj;
  }

  /**   数据转换   */
  convertData = (props) => {
    /*   获取从表编号   */
    this.sSlaveId = this.getSlaveId(props);
    /*   获取控件名   */
    this.sName = this.getName(props);
    /*   获取showType所需参数   */
    this.propsAllData = { ...this.getPropsAllData(props) };
    /*   获取dataValue   */
    this.dataValue = { ...this.getDataValue(props) };
    /*   获取showConfig   */
    this.showConfig = { ...this.getShowConfig(this.propsAllData) };
    /*   获取是否渲染   */
    this.isRender = this.getIsRender(this.propsAllData);
    /*   获取全局信息   */
    this.app = this.getApp(this.propsAllData);
    /*   获取窗体编号   */
    this.form = this.getFormId(this.propsAllData);
    /*   获取主表编号   */
    this.sId = this.getMasterId(this.propsAllData);
    /*   获取回带函数   */
    const funcObj = this.getReturnFunc(this.propsAllData);
    this.onSlaveChange = funcObj.onSlaveChange; /*   表单数据改变事件方法(数据格式:函数)   */
    this.onReturnMasterSelectValue = funcObj.onReturnMasterSelectValue; /*   回带主表下拉数据(数据格式:函数)   */
    this.onReturnSlaveSelectValue = funcObj.onReturnSlaveSelectValue; /*   回带从表下拉数据(数据格式:函数)   */
  }

  /**   渲染   */
  render() {
    /*   获取showType的参数   */
    const showTypeProps = this.getShowTypeProps();

    /*   页面输出   */
    return (
      <td >
        <ShowTypeNew {...showTypeProps} />
      </td>
    );
  }
}

export default StaticEditTableCell;
